package com.vxdata

import com.vxdata.函数_1_基础.f

object 函数_1_基础 {

  /**
   * def    定义函数的关键字
   * f      函数名
   * arg    参数名
   * String 参数类型
   * Unit   返回值类型
   *
   * @param arg
   */
  def f(arg: String): Unit = {
    println(arg)
  }


  /**
   * （1）Scala 语言可以在任何的语法结构中声明任何的语法
   * （2）函数没有重载和重写的概念；方法可以进行重载和重写
   * （3）Scala 中函数可以嵌套定义
   */


  /**
   * （1）return 可以省略，Scala 会使用函数体的最后一行代码作为返回值
   * （2）如果函数体只有一行代码，可以省略花括号
   * （3）返回值类型如果能够推断出来，那么可以省略（:和返回值类型一起省略）
   * （4）如果有 return，则不能省略返回值类型，必须指定
   * （5）如果函数明确声明 unit，那么即使函数体中使用 return 关键字也不起作用
   * （6）Scala 如果期望是无返回值类型，可以省略等号
   * （7）如果函数无参，但是声明了参数列表，那么调用时，小括号，可加可不加
   * （8）如果函数没有参数列表，那么小括号可以省略，调用时小括号必须省略
   * （9）如果不关心名称，只关心逻辑处理，那么函数名（def）可以省略
   */


  def main(args: Array[String]): Unit = {
    f("hello world")


    // 函数标准写法
    def f1(s: String): String = {
      return s + " jinlian"
    }

    // return 可以省略,Scala 会使用函数体的最后一行代码作为返回值
    def f2(s: String): String = {
      s + " jinlian"
    }

    // 如果函数体只有一行代码，可以省略花括号
    def f3(s: String): String = s + " jinlian"

    // 返回值类型如果能够推断出来，那么可以省略（:和返回值类型一起省略）
    def f4(s: String) = s + " jinlian"

    // 如果有 return，则不能省略返回值类型，必须指定。
    def f5(): String = {
      return " jinlian"
    }

    // 如果函数明确声明无返回值 unit，那么即使函数体中使用 return 关键字也不起作用
    def f6(): Unit = {
      return "dalang5"
    }

    // Scala 如果期望是无返回值类型,可以省略等号 将无返回值的函数称之为过程
    def f7() {
      "dalang6"
    }

    // 如果函数无参，但是声明了参数列表，那么调用时，小括号，可加可 不加
    def f8() = "dalang7"

    println(f8)


    // 如果不关心名称，只关心逻辑处理，那么函数名（def）可以省略
    def f9 = (x: String) => {
      println(x + "wusong")
    }

    def f10(f: String => Unit) = {
      f("")
    }

    f10(f9)
    println(f10((x: String) => {
      println("wusong")
    }))

  }


}
